﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Skyper.Model;
using System.ComponentModel;
using System.Windows.Threading;
using System.Diagnostics;

namespace Skyper {
	public partial class App : Application {
		#region Nested
		public class QuitException : Exception { }
		#endregion
		#region Fields
		internal static readonly SkypeModel Skype;
		private static Dispatcher dispatcher;
		private bool phoneApplicationInitialized = false;
		#endregion
		#region Constructor
		static App() {
			Skype = new SkypeModel();
			
		}
		/// <summary>
		/// Constructor for the Application object.
		/// </summary>
		public App() {
			// Global handler for uncaught exceptions. 
			UnhandledException += Application_UnhandledException;

			// Show graphics profiling information while debugging.
			if (System.Diagnostics.Debugger.IsAttached) {
				// Display the current frame rate counters.
				Application.Current.Host.Settings.EnableFrameRateCounter = true;

				// Show the areas of the app that are being redrawn in each frame.
				//Application.Current.Host.Settings.EnableRedrawRegions = true;

				// Enable non-production analysis visualization mode, 
				// which shows areas of a page that are being GPU accelerated with a colored overlay.
				//Application.Current.Host.Settings.EnableCacheVisualization = true;
			}

			// Standard Silverlight initialization
			InitializeComponent();

			// Phone-specific initialization
			InitializePhoneApplication();
		}
		#endregion
		#region Private
		private void Application_Launching(object sender, LaunchingEventArgs e) {
			Skype.Load();
		}
		private void Application_Activated(object sender, ActivatedEventArgs e) {
			Skype.Load();
		}
		private void Application_Deactivated(object sender, DeactivatedEventArgs e) {
			Skype.Save();
		}
		private void Application_Closing(object sender, ClosingEventArgs e) {
			Skype.Save();
		}

		private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) {
			if (System.Diagnostics.Debugger.IsAttached) {
				// A navigation has failed; break into the debugger
				System.Diagnostics.Debugger.Break();
			}
		}
		private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) {
			if (e.ExceptionObject is QuitException) {
				return;
			}

			if (System.Diagnostics.Debugger.IsAttached) {
				Debug.WriteLine(e.ExceptionObject);
				System.Diagnostics.Debugger.Break();
			}
		}

		private void InitializePhoneApplication() {
			if (phoneApplicationInitialized)
				return;

			// Create the frame but don't set it as RootVisual yet; this allows the splash
			// screen to remain active until the application is ready to render.
			RootFrame = new PhoneApplicationFrame();
			RootFrame.Navigated += CompleteInitializePhoneApplication;

			// Handle navigation failures
			RootFrame.NavigationFailed += RootFrame_NavigationFailed;

			// Ensure we don't initialize again
			phoneApplicationInitialized = true;
		}
		private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e) {
			// Set the root visual to allow the application to render
			if (RootVisual != RootFrame)
				RootVisual = RootFrame;

			// Remove this handler since it is no longer needed
			RootFrame.Navigated -= CompleteInitializePhoneApplication;
#if DEBUG
			//Application.Current.Host.Settings.EnableRedrawRegions = true;
#endif
			dispatcher = RootFrame.Dispatcher;
		}
		#endregion
		#region Public
		public static void OpenChat(ContactModel model) {
			(App.Current as App).RootFrame.Navigate(new Uri("/ChatPage.xaml?Username=" + model.Username, UriKind.Relative));
		}
		public static void OpenMain() {
			(App.Current as App).RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
		}
		#endregion
		#region Property
		public PhoneApplicationFrame RootFrame {
			get;
			private set;
		}
		public static bool IsDesignTime() {
			try {
				Boolean design = DesignerProperties.GetIsInDesignMode((App.Current as App).RootFrame);
				return design;
			} catch {
				if (System.Diagnostics.Debugger.IsAttached) {
					System.Diagnostics.Debugger.Break();
				}
				return false;
			}
		}
		public static Dispatcher Dispatcher {
			get {
				return dispatcher;
			}
		}
		public static Boolean HasDispatcher {
			get {
				return (Dispatcher != null);
			}
		}
		#endregion
		#region Static
		
		#endregion

		
	}

}